/**
 * 结构体定义
 */

package main

import (
    "gitee.com/mayiweb/gohs"
)

// Ctp 行情 spi 回调函数
type HsMdSpi struct{
    HsClient
}

// Ctp 交易 spi 回调函数
type HsTradeSpi struct{
    HsClient
}

// Ctp 客户端 行情、交易模块 全局变量
type HsClient struct {

    // 行情模块 api
    MdApi gohs.CHSMdApi

    // 交易模块 api
    TradeApi gohs.CHSTradeApi

    // ctp 服务器，及交易账号
    MdFront []string
    TradeFront []string

    // 经纪公司账号
    AccountID   string
    Password    string

    // 客户端认证
    AppID       string
    AuthCode    string

    // 交易服务器授权文件
    LicensePath string

    // 行情服务器授权文件
    MdLicensePath string

    // 当前交易日期
    TradingDay string

    // 当前交易月份
    TradeMonth string

    // 行情请求编号
    MdRequestId int

    // 交易请求编号
    TradeRequestId int

    // 交易系统是否已经初始化了
    IsTradeInit bool

    // 交易程序是否初始化完成（自动完成如下动作：交易账号登陆、结算单确认、查询合约、查询资金账户、查询用户报单、查询用户持仓 后算完成）
    IsTradeInitFinish bool

    // 交易程序是否已登录过
    IsTradeLogin bool

    // 行情系统是否已经初始化了
    IsMdInit bool

    // 行情程序是否已登录过
    IsMdLogin bool
}

// 登录成功结构体
type LoginStruct struct {
    // 营业部号
    BranchID int
    // 账号
    AccountID string
    // 投资者姓名
    UserName string
    // 交易日
    TradingDay int
    // 上个交易日
    PreTradingDay int
    // 账单确认标志
    BillConfirmFlag string
    // 会话编码
    SessionID int
    // 投资者端应用类别
    UserApplicationType string
    // 投资者端应用信息
    UserApplicationInfo string
    // 风险等级
    RiskLevel string
    // 投资者上次登陆的Mac地址
    LastMacAddress string
    // 投资者上次登陆的IP地址
    LastIPAddress string
    // 上次登录成功时间
    LastLoginTime int
    // 郑商所当前时间
    CZCETime int
    // 大商所当前时间
    DCETime int
    // 上期所当前时间
    SHFETime int
    // 中金所当前时间
    CFFEXTime int
    // 能源中心当前时间
    INETime int
    // 最大报单引用(返回会话上次最大报单引用)
    MaxOrderRef string
    // 客户编号
    UserID string
    // 广期所当前时间
    GFEXTime int
}

// 合约详情
type InstrumentStruct struct {
    // map key
    MapKey string
    // 交易所代码
    ExchangeID string
    // 合约代码
    InstrumentID string
    // 合约 code
    InstrumentCode string
    // 合约名称
    InstrumentName string
    // 合约英文名称
    InstrumentEngName string
    // 合约品种编码
    ProductID string
    // 产品类型
    ProductType string
    // 市价单最大报单量
    MaxMarketOrderVolume int
    // 市价单最小报单量
    MinMarketOrderVolume int
    // 限价单最大报单量
    MaxLimitOrderVolume int
    // 限价单最小报单量
    MinLimitOrderVolume int
    // 合约数量乘数
    VolumeMultiple int
    // 最小变动价位
    PriceTick float64
    // 期权对应的标的合约代码
    UnderlyingInstrID string
    // 行权价
    ExercisePrice float64
    // 期权类型
    OptionsType string
    // 交易标志
    TradingFlag string
    // 上市日
    MarketDate int32
    // 到期日
    ExpireDate int32
    // 行权开始日期
    BeginExerciseDate int32
    // 行权截至日期
    EndExerciseDate int32
    // 开始交割日
    BeginDeliveryDate int32
    // 结束交割日
    EndDeliveryDate int32
    // 币种
    CurrencyID string
    // 组合类型
    CombType string

    // 交易所名称
    ExchangeName string
    // 产品类型标题
    ProductTypeTitle string
}

// 资金账户
type AccountStruct struct {
    // map key
    MapKey string
    // 账号
    AccountID string
    // 上日余额
    YdBalance float64
    // 上日持仓保证金
    YdPositionMargin float64
    // 上日资金权益
    YdFundEquity float64
    // 资金权益
    FundEquity float64
    // 期权市值
    OptionsMarketValue float64
    // 总权益
    Equity float64
    // 可用资金
    AvailableBalance float64
    // 可取资金
    WithdrawBalance float64
    // 保证金
    Margin float64
    // 冻结保证金
    FrozenMargin float64
    // 行权冻结保证金
    ExerciseFrozenMargin float64
    // 风险度
    RiskDegree float64
    // 权利金
    Premium float64
    // 冻结权利金
    FrozenPremium float64
    // 手续费
    Commission float64
    // 冻结手续费
    FrozenCommission float64
    // 平仓盈亏
    CloseProfit float64
    // 持仓盈亏
    PositionProfit float64
    // 平仓盯市盈亏
    CloseProfitByDate float64
    // 持仓盯市盈亏
    PositionProfitByDate float64
    // 转入金额
    Deposit float64
    // 转出金额
    Withdraw float64
    // 货币质押金额
    FundMortgage float64
    // 仓单质押金额
    WarrantMortgage float64
    // 冻结资金
    FrozenBalance float64
    // 解冻资金
    UnFrozenBalance float64
    // 币种
    CurrencyID string
    // 对冲风险度
    HedgeRiskDegree float64
    // 今日盈亏
    TodayProfit float64
}

// 报单信息
type OrderStruct struct {
    // map key
    MapKey string
    // 账号
    AccountID string
    // 报单编码
    OrderSysID string
    // 经纪公司报单编码
    BrokerOrderID string
    // 会话编码
    SessionID int32
    // 报单引用
    OrderRef string
    // 交易所代码
    ExchangeID string
    // 合约代码
    InstrumentID string
    // 合约名称
    InstrumentName string
    // 买卖方向
    Direction string
    // 买卖方向-中文标题
    DirectionTitle string
    // 开平标志
    OffsetFlag string
    // 开平标志-中文标题
    OffsetFlagTitle string
    // 投机/套保/备兑类型
    HedgeType string
    // 投机/套保/备兑类型-中文标题
    HedgeTypeTitle string
    // 报单价格
    OrderPrice float64
    // 报单数量
    OrderVolume int
    // 报单状态
    OrderStatus string
    // 报单状态-中文标题
    OrderStatusTitle string
    // 成交数量
    TradeVolume int
    // 撤单数量
    CancelVolume int
    // 成交价格
    TradePrice float64
    // 交易日
    TradingDay int32
    // 报单日期
    InsertDate int32
    // 报单时间
    InsertTime string
    // 申报时间
    ReportTime string
    // 报单指令
    OrderCommand int32
    // 最小成交量
    MinVolume int
    // 止损止盈价
    SpringPrice float64
    // 互换标志
    SwapOrderFlag string
    // 强平原因
    ForceCloseReason string
    // 错误信息
    ErrorMsg string
    // 期权对应的标的合约代码
    UnderlyingInstrID string
    // 报单发起方
    OrderSource string
    // 组合持仓编码
    CombPositionID string

    // 有效秒数【0表示不限制，秒倒计时，到0撤单】
    Second int
}

// 成交信息
type TradeStruct struct {
    // map key
    MapKey string
    // 账号
    AccountID string
    // 成交编码
    TradeID string
    // 报单编码
    OrderSysID string
    // 经纪公司报单编码
    BrokerOrderID string
    // 会话编码
    SessionID int
    // 报单引用
    OrderRef string
    // 交易所代码
    ExchangeID string
    // 合约代码
    InstrumentID string
    // 合约名称
    InstrumentName string
    // 买卖方向
    Direction string
    // 买卖方向-中文标题
    DirectionTitle string
    // 开平标志
    OffsetFlag string
    // 开平标志-中文标题
    OffsetFlagTitle string
    // 投机/套保/备兑类型
    HedgeType string
    // 成交数量
    TradeVolume int
    // 成交价格
    TradePrice float64
    // 交易日
    TradingDay int
    // 成交时间
    TradeTime string
    // 期权对应的标的合约代码
    UnderlyingInstrID string
    // 组合持仓编码
    CombPositionID string
    // 成交手续费
    TradeCommission float64
}

// 持仓汇总
type PositionStruct struct {
    // map key
    MapKey string
    // 账号
    AccountID string
    // 交易所代码
    ExchangeID string
    // 合约代码
    InstrumentID string
    // 合约名称
    InstrumentName string
    // 买卖方向
    Direction string
    // 买卖方向-中文标题
    DirectionTitle string
    // 投机/套保/备兑类型
    HedgeType string
    // 投机/套保/备兑类型-中文标题
    HedgeTypeTitle string
    // 上日持仓数量
    YdPositionVolume int
    // 持仓数量
    PositionVolume int
    // 今日持仓数量
    TodayPositionVolume int
    // 可用持仓数量
    AvailablePositionVolume int
    // 今日可用持仓数量
    TodayAvailablePositionVolume int
    // 持仓保证金
    PositionMargin float64
    // 权利金
    Premium float64
    // 手续费
    Commission float64
    // 开仓冻结数量
    OpenFrozenVolume int
    // 平仓冻结数量
    CloseFrozenVolume int
    // 组合数量
    CombVolume int
    // 行权冻结数量
    ExerciseFrozenVolume int
    // 冻结保证金
    FrozenMargin float64
    // 行权冻结保证金
    ExerciseFrozenMargin float64
    // 冻结权利金
    FrozenPremium float64
    // 冻结手续费
    FrozenCommission float64
    // 开仓量
    OpenVolume int
    // 平仓量
    CloseVolume int
    // 开仓金额
    OpenBalance float64
    // 平仓金额
    CloseBalance float64
    // 开仓成本
    OpenCost float64
    // 持仓成本
    PositionCost float64
    // 持仓均价
    PositionPrice float64
    // 持仓盈亏
    PositionProfit float64
    // 平仓盈亏
    CloseProfit float64
    // 期权市值
    OptionsMarketValue float64
    // 期权对应的标的合约代码
    UnderlyingInstrID string

    // 止损价
    StopPrice float64
    // 持仓时段最高价
    MaxTickPrice float64
    // 移动止损价
    MovingStopPrice float64
    // 移动止损触发开启价差（仅盈利有效）
    MovingPriceDiff float64
    // 移动止损回退平仓价差（最高价回退到价差就平）
    MovingStopPriceDiff float64
}

// 报单录入
type InputOrderStruct struct {
    // 报单引用
    OrderRef string
    // 交易所代码
    ExchangeID string
    // 合约代码
    InstrumentID string
    // 买卖方向
    Direction byte
    // 开平标志
    OffsetFlag byte
    // 投机/套保/备兑类型
    HedgeType string
    // 报单价格
    Price float64
    // 报单数量
    Volume int
    // 报单指令
    OrderCommand int32
    // 最小成交量
    MinVolume int
    // 止损止盈价
    SpringPrice float64
    // 互换标志
    SwapOrderFlag string
    // 组合持仓编码
    CombPositionID string

    // 策略代码
    StrategyCode string
    // 策略消息
    StrategyMsg string
    // 有效秒数【0表示不限制，秒倒计时，到0撤单】
    Second int
    // 时间【回测模式用到了】
    UpdateTime string
}

// 深度行情
type MarketDataStruct struct {
    // 交易日
    TradingDay string
    // 最后更新时间
    UpdateTime string
    // 合约代码
    InstrumentID string
    // 合约代码
    InstrumentName string
    // 合约代码（期权为股票代码）
    InstrumentCode string
    // 交易所代码
    ExchangeID string
    // 最新价
    LastPrice float64
    // 昨结算价
    PreSettlementPrice float64
    // 昨收盘价
    PreClosePrice float64
    // 开盘价
    OpenPrice float64
    // 最高价
    HighestPrice float64
    // 最低价
    LowestPrice float64
    // 成交数量(总成交量)
    Volume int
    // 成交金额
    TradeBalance float64
    // 总持量
    OpenInterest int
    // 收盘价
    ClosePrice float64
    // 结算价
    SettlementPrice float64
    // 涨停板价
    UpperLimitPrice float64
    // 跌停板价
    LowerLimitPrice float64
    // 昨虚实度
    PreDelta float64
    // 今虚实度
    CurrDelta float64
    // 申买价一
    BidPrice1 float64
    // 申买量一
    BidVolume1 int
    // 申卖价一
    AskPrice1 float64
    // 申卖量一
    AskVolume1 int
    // 申买价二
    BidPrice2 float64
    // 申买量二
    BidVolume2 int
    // 申卖价二
    AskPrice2 float64
    // 申卖量二
    AskVolume2 int
    // 申买价三
    BidPrice3 float64
    // 申买量三
    BidVolume3 int
    // 申卖价三
    AskPrice3 float64
    // 申卖量三
    AskVolume3 int
    // 申买价四
    BidPrice4 float64
    // 申买量四
    BidVolume4 int
    // 申卖价四
    AskPrice4 float64
    // 申卖量四
    AskVolume4 int
    // 申买价五
    BidPrice5 float64
    // 申买量五
    BidVolume5 int
    // 申卖价五
    AskPrice5 float64
    // 申卖量五
    AskVolume5 int
    // 平均价格
    AveragePrice float64
    // 昨持仓量
    PreOpenInterest float64
    // 合约交易状态
    InstrumentTradeStatus string
    // 合约实时开仓限制
    OpenRestriction string
}


// 昨日收盘数据
type LastTimeMarketStruct struct {
    // id
    id int
    // 交易日期
    TradingDay string
    // 合约代码
    InstrumentID string
    // 昨收盘
    PreClosePrice float64
    // 最新价
    LastPrice float64
    // 今开盘
    OpenPrice float64
    // 今收盘
    ClosePrice float64
    // 最低价
    LowestPrice float64
    // 最高价
    HighestPrice float64
    // 跌停板价
    LowerLimitPrice float64
    // 涨停板价
    UpperLimitPrice float64
    // 持仓量
    OpenInterest int
    // 成交数量
    Volume int
    // 创建时间
    CreateTime string
    // 是否涨跌停了
    IsLimit bool
    // 涨跌方向
    Direction string
    // 昨收与今收的价差
    PriceDiff float64
    // 最高价最低价价差
    MaxMinPriceDeff float64
    // 开盘价与收盘价涨跌方向
    OpenCloseDirection string
    // 开盘价与收盘价价差
    OpenClosePriceDiff float64
}

// 分时行情数据
type MinuteMarketDataStruct struct {
    // 合约代码
    InstrumentID string
    // 行情时间（起始时间）
    UpdateTime string
    // 行情结束时间（5分钟，15分钟，30分钟 的时候会用到）
    EndUpdateTime string
    // 成交量
    Volume int
    // 持仓量
    OpenInterest int
    // 本分钟总成交量
    TotalVolume int
    // 开盘价
    OpenPrice float64
    // 最新价（收盘价）
    LastPrice float64
    // 最低价
    MinPrice float64
    // 最高价
    MaxPrice float64
    // 当前分时数据key键
    LastMinuteKey int
    // 上一分钟的分时数据key键
    PrevMinuteKey int
    // 价差（高价减低价）
    PriceDiff float64
    // 分时线涨跌（B：涨，S：跌）
    Direction string
    // 自定义代码（期权专用）
    BaseCode string
    // 计数（每分钟加1）
    Count int

    // 仅在部分策略中使用

    // 分时类型
    Type string
    // 是否最高价（与之前价格相比）
    IsMaxPrice bool
    // 是否最低价（与之前价格相比）
    IsMinPrice bool
}

// 箱体分时行情
type BoxMinuteMarketDataStruct struct {
    // 合约代码
    InstrumentID string
    // 开始行情时间
    StartUpdateTime string
    // 结束行情时间
    EndUpdateTime string
    // 最低价
    MinPrice float64
    // 最高价
    MaxPrice float64
}

// 策略运行结构体
type StrategyRunLogStruct struct {
    // 合约代码
    InstrumentID string
    // 策略代码
    StrategyCode string
    // 消息内容
    Msg string
    // 最后修改时间
    UpdateTime string
}

// 合约行情结构体（用来储存运行时的一些参数）
type InstrumentMarketStruct struct {
    // 合约代码
    InstrumentID string
    // 涨幅
    Fudu float64
    // 最低价
    MinPrice float64
    // 最高价
    MaxPrice float64
    // 最新价
    LastPrice float64
    // 最后修改时间
    UpdateTime string
    // 昨收价
    PreClosePrice float64
}

// 输入合约箱体参数
type InputInstrumentBoxStruct struct {
    // 合约代码
    InstrumentID string

    // 箱体最小价差高度
    BoxMinHeight float64
}

// 自动交易日志
type AutoTradeLogStruct struct {
    // 合约代码
    InstrumentID string
    // 策略代码
    StrategyCode string
    // 消息内容
    Msg string
    // 报单引用
    OrderRef int
    // 创建时间
    CreateTime string
    // 持仓均价（平仓时用来计算盈亏）
    PositionPrice float64
}

// 策略行情运行日志
type StrategyMarketRunLogStruct struct {
    // 合约代码
    InstrumentID string
    // 策略代码
    StrategyCode string
    // 关联股票代码
    InstrumentCode string
    // 行情触发次数
    MarketRunCount int
    // 策略触发次数
    StrategyRunCount int
}

// 合约持仓
type InstrumentPositionsStruct struct {

    // 买持仓
    Buy PositionStruct
    // 买持仓存在
    BuyExist bool

    // 卖持仓
    Sell PositionStruct
    // 卖持仓存在
    SellExist bool
}